from queue import Queue
import threading
import asf_func
import asf_struct
from ctypes import *
import asf_common
import cv2
import time
import uuid
import os
#app_id
app_id = b"HdMP1QbuLgMAVcoNKp9NDPtbeYVmAayCnbc52Vtp4rRm"
#sdk_key
sdk_key = b"DAxW6CPJzWxHrKB5JrJF5GeRAci9UNhGYHaMAiFhMWhB"
#激活码
active_key = b"8691-119K-D13M-6941"
#调用在线激活Api进行在线激活
ret = asf_func.online_activate(app_id, sdk_key, active_key)
if ret == 0 or ret == 90114:
    print("激活成功:",ret)
else:
    print("激活失败:", ret)

detect_faces = asf_struct.ASFMultiFaceInfo
Handle = c_void_p()
old_img = cv2.imread("C:\\test\\ai-test\\a1.jpg",1)
img = old_img
#img.ctypes.data_as()
image_bytes = bytes(img)
image_ubytes = cast(image_bytes, POINTER(c_ubyte))
ret = asf_func.detect_face(Handle,img.shape[1],img.shape[0],asf_common.ASVL_PAF_RGB24_B8G8R8,img.ctypes.data_as(POINTER(c_ubyte)),byref(detect_faces))
#待处理的高质量抓拍人脸帧图片，key为FaceId
zp_list = {}
#不同FaceId当前最新的抓取时间，主要用来计算是否开始获取最优抓拍用
zp_time_list = {}
#大于多少阈值的人脸算作合格的人脸
storage_face_threshold = 0.5
if ret !=0:
    print("检测人脸失败：%s" % (ret))
if detect_faces.faceNum >0:
    for i in range(detect_faces.faceNum):
        # 质量检测接口需要传入一个单人脸信息的结构体数据，因此这里实例化一个
        single_face_info = asf_struct.ASFSingleFaceInfo()
        # 将detect_faces多人脸结果中按照索引，将里面单个人脸新，拿出来，赋值给single_face_info单人脸结构体数据
        single_face_info.faceRect.left = detect_faces.faceRect[i].left
        single_face_info.faceRect.top = detect_faces.faceRect[i].top
        single_face_info.faceRect.right = detect_faces.faceRect[i].right
        single_face_info.faceRect.bottom = detect_faces.faceRect[i].bottom
        single_face_info.faceOrient = detect_faces.faceOrient[i]
        single_face_info.faceDataInfo = detect_faces.faceDataInfoList[i]

        #用来接收质量得分的变量，以下会使用引用传递的方式传给接口。
        confidenceLevel = c_float()
        # 调用质量检测接口，获取单个人脸图片的质量得分
        ret = asf_func.image_quality_detect(
            Handle,
            img.shape[1],
            img.shape[0],
            asf_common.ASVL_PAF_RGB24_B8G8R8,
            image_ubytes,
            byref(single_face_info),
            0,
            byref(confidenceLevel),
            1
        )

        # 准备指定FaceId的列表，如果不存在就初始化
        if detect_faces.faceID[i] not in zp_list:
            zp_list[detect_faces.faceID[i]] = []

            # 如果检测出来的得分大于设置的合格分数，就将其存储到指定FaceId的列表中，其余的全部过滤掉，因为低质量的分数，放进来也没用
            if confidenceLevel.value > storage_face_threshold:
                print("发现高质量得分人脸:%s" % (confidenceLevel.value))
                zp_list[detect_faces.faceID[i]].append((confidenceLevel.value, old_img,
                                                        detect_faces.faceRect[i].left,
                                                        detect_faces.faceRect[i].top,
                                                        detect_faces.faceRect[i].right,
                                                        detect_faces.faceRect[i].bottom,
                                                        detect_faces.faceID[i]))
            zp_time_list[detect_faces.faceID[i]] = time.time()
            # 更新下指定faceId对应的最新时间戳，主要用来给gen_zq处理线程判断哪个faceid已经没有连续记录了，是否可以收割了。

            cv2.rectangle(img, (detect_faces.faceRect[i].left, detect_faces.faceRect[i].top),
                          (detect_faces.faceRect[i].right, detect_faces.faceRect[i].bottom), (0, 0, 255), 1)
            cv2.putText(img, str("qa:%.2f" % (confidenceLevel.value)),
                        (detect_faces.faceRect[i].left, detect_faces.faceRect[i].top - 5), cv2.FONT_HERSHEY_SIMPLEX,
                        0.5, (0, 0, 255), 1)
            cv2.putText(img, "id:" + str(detect_faces.faceID[i]),
                        (detect_faces.faceRect[i].left, detect_faces.faceRect[i].top - 20), cv2.FONT_HERSHEY_SIMPLEX,
                        0.5, (0, 0, 255), 1)
            # 以上是根据人脸检测的结果以及置信度得分，进行画框，以及文字标注，qa为质量得分   id为faceid
    cv2.imshow("RealTimeDisplay", img)
    cv2.waitKey(1)